/**
给定一个三角形，找出自顶向下的最小路径和。每一步只能移动到下一行中相邻的结点上。

相邻的结点 在这里指的是 下标 与 上一层结点下标 相同或者等于 上一层结点下标 + 1 的两个结点。

 

例如，给定三角形：

[
     [2],
    [3,4],
   [6,5,7],
  [4,1,8,3]
]
自顶向下的最小路径和为 11（即，2 + 3 + 5 + 1 = 11）。

 

说明：

如果你可以只使用 O(n) 的额外空间（n 为三角形的总行数）来解决这个问题，那么你的算法会很加分。



来源：力扣（LeetCode）
链接：https://leetcode-cn.com/problems/triangle
著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
*/
func maximalSquare(matrix [][]byte) int {
    if len(matrix) == 0{
        return 0
    }
    m, n,res := len(matrix), len(matrix[0]), 0
    dp := make([][]int,m+1)
    for i:=0;i<m+1;i++{
        dp[i] = make([]int,n+1)
    }
    for i:=1;i<m+1;i++{
        for j:=1;j<n+1;j++{
            if matrix[i-1][j-1] == '1'{
                dp[i][j] = min(dp[i-1][j],dp[i][j-1],dp[i-1][j-1])+1
                res = max(res,dp[i][j] * dp[i][j])
            }
        }
    }
    return res
}
func min(a,b,c int)int{
    if a > b{
        if b < c{
            return b
        }
        return c
    }else{
        if a < c{
            return a
        }
        return c
    }
}
func max(a, b int)int{
    if a > b{
        return a
    }
    return b
}